package com.sgq.vue.controller.system;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sgq.vue.dto.RoleCityDto;
import com.sgq.vue.dto.RolePermissionDto;
import com.sgq.vue.entity.system.Role;
import com.sgq.vue.result.Result;
import com.sgq.vue.service.system.PermissionService;
import com.sgq.vue.service.system.RoleService;
import com.sgq.vue.vo.query.RolePermissionVo;
import com.sgq.vue.vo.query.RoleQueryVo;
import com.sgq.vue.vo.query.resource.RoleCityVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author SGQ
 * @since 2023-10-30
 */
@RestController
@RequestMapping("/api/role")
public class RoleController {
        @Autowired
        private RoleService roleService;
        @Autowired
        private PermissionService permissionService;
        /**
         * 分页查询角色列表
         * @param roleQueryVo
         * @return
         */
        @GetMapping("/list")
        public Result list(RoleQueryVo roleQueryVo){
            //创建分页对象
            IPage<Role> page = new Page<Role>
                    (roleQueryVo.getPageNo(),roleQueryVo.getPageSize());
            //调用分页查询方法
            roleService.findRoleListByUserId(page,roleQueryVo);
            //返回数据
            return Result.ok(page);
        }

        /**
         * 添加角色
         * @param role
         * @return
        */
        @PostMapping("/add")
        public Result add(@RequestBody Role role){
            System.out.println("role = " + role);
            if(roleService.save(role)){
                return Result.ok().message("角色添加成功");
            }
            return Result.error().message("角色添加失败");
        }
        /**
         * 修改角色
         * @param role
         * @return
         */
        @PutMapping("/update")
        public Result update(@RequestBody Role role){
            if(roleService.updateById(role)){
                return Result.ok().message("角色修改成功");
            }
            return Result.error().message("角色修改失败");
        }
        /**
         * 删除角色
         * @param id
         * @return
         */
        @DeleteMapping("/delete/{id}")
        public Result delete(@PathVariable Long id){

            if(roleService.removeRoleAndRelationship(id)){

                return Result.ok().message("角色删除成功");
            }
            return Result.error().message("角色删除失败");
        }

        /**
         *  检查角色有没有被分配到用户
         * @param
         * @return
         */
        @GetMapping ("/check/{id}")
        public Result check(@PathVariable("id") Long id){

            boolean check = roleService.check(id);

            return check == true ?  Result.exist().message("该角色已被被分配到用户") :  Result.ok();

        }
        /**
         * 分配角色-查询权限树数据
         *
         * @param userId
         * @param roleId
         * @return
         */
        @GetMapping("/getAssignPermissionTree")
        public Result getAssignPermissionTree(Long userId, Long roleId) {
            //调用查询权限树数据的方法
            RolePermissionVo permissionTree = permissionService.findPermissionTree(userId, roleId);
            //返回数据
            return Result.ok(permissionTree);
        }

        /**
         * 分配权限-保存权限数据
         *
         * @param rolePermissionDto
         * @return
         */
        @PostMapping("/saveRoleAssign")
        public Result saveRoleAssign(@RequestBody RolePermissionDto rolePermissionDto) {
            if (roleService.saveRolePermission(rolePermissionDto.getRoleId(),
                    rolePermissionDto.getList())) {
                return Result.ok().message("权限分配成功");
            } else {
                return Result.error().message("权限分配失败");
            }
        }


        /**
         * 分配城市天气-查询城市树数据
         *
         * @param userId  当前用户拥有哪些城市权限
         * @param roleId  被操作角色本身拥有哪些城市权限
         * @return
         */
        @GetMapping("/getAssignCityWeatherTree")
        public Result getAssignCityWeatherTree(Long userId, Long roleId) {
            //调用查询权限树数据的方法
            RoleCityVo cityTree = roleService.findCityWeatherTree(userId, roleId);
            //返回数据
            return Result.ok(cityTree);
        }
        /**
         * 分配城市-保存数据
         *
         * @param roleCityDto
         * @return
         */
        @PostMapping("/saveCityAssign")
        public Result saveCityAssign(@RequestBody RoleCityDto roleCityDto) {
            if (roleService.saveRoleCity(roleCityDto.getRoleId(),
                    roleCityDto.getList())) {
                return Result.ok().message("城市分配成功");
            } else {
                return Result.error().message("城市分配失败");
            }
        }

        /**
         * 查询用户所有角色
         * @param userId
         * @return
         */
        @GetMapping("/getUserAllRoles/{userId}")
        public Result getUserAllRoles(@PathVariable("userId") Long userId) {
            List<Long> roles = roleService.findRoleIdByUserId(userId);
            return Result.ok(roles);
        }



}


